package com.dsi.capa.db.dao;


import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.sql.DataSource;
import javax.swing.JOptionPane;

import com.dsi.capa.db.model.Asistencia;


public class AsistenciaDAO extends BasicDAO<Asistencia> {

	/**
	 * 
	 */
	private static final long serialVersionUID = 1L;
	
	

	public AsistenciaDAO() {
		super();
	}

	public AsistenciaDAO(DataSource ds) {
		super(ds);
	}
	//insertar en la base
	@Override
	public void save(Asistencia target) {
		
		StringBuffer sql = new StringBuffer();
		sql.append("INSERT INTO PLANILLA(FECHACREACION, CODIGOEMPLEADO, ENTRADA)");
		sql.append("VALUES(CURDATE(), ?, NOW())");
		try {
			preparedStatement = getConnection().prepareStatement(
					sql.toString());
			preparedStatement.setString(1, target.getCodigoEmpleado());
			preparedStatement.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}
	}

	@Override
	public void update(Asistencia target) {
		StringBuffer sql = new StringBuffer();
		sql.append("UPDATE PLANILLA SET SALIDA = NOW(), HORAS = HOUR(TIMEDIFF(salida,entrada)) + MINUTE(TIMEDIFF(salida,entrada))/60 + SECOND(TIMEDIFF(salida,entrada))/3600 ");
		sql.append("WHERE CODIGOEMPLEADO = ? AND FECHACREACION = CURDATE() AND SALIDA IS NULL");

		try {
			preparedStatement = getConnection().prepareStatement(
					sql.toString());
			
			preparedStatement.setString(1, target.getCodigoEmpleado());
			preparedStatement.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}
	}

	@Override
	public void delete(Asistencia target) {
		StringBuffer sql = new StringBuffer();
		sql.append("DELETE FROM Alumno WHERE CARNET = ? ");
		try {
			preparedStatement = getConnection().prepareStatement(
					sql.toString());
			//preparedStatement.setString(1, target.getCarnet());
//			preparedStatement.setLong(1, target.getCodigo());
			preparedStatement.executeUpdate();
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}
	}

	@Override
	public List<Asistencia> findAll() {
		return findAll(null, null);
	}

	@Override
	public List<Asistencia> findAll(Integer firstRow, Integer maxRows) {
		List<Asistencia> Alumno = new ArrayList<Asistencia>();
		int i = 0;
		int lastRow = 0;
		StringBuffer sql = new StringBuffer();
		sql.append("SELECT CARNET, NOMBREALUMNO, APELLIDOALUMNO, ");
		sql.append("NITALUMNO, DUIALUMNO FROM Alumno");
		
		try {
			preparedStatement = getConnection().prepareStatement(sql.toString());
			resultSet = preparedStatement.executeQuery();
			if(firstRow != null && maxRows != null) {
				lastRow = firstRow.intValue() + maxRows;
				while(resultSet.next()) {
					if(i >= firstRow.intValue()) {
//						Alumno c = new Alumno();
//						c.setCarnet(resultSet.getString("CARNET"));
//						Alumno.add(c);
					}
					i++;
					if(i >= lastRow) {
						break;
					}
				}
			} else {
				while(resultSet.next()) {
//					Alumno c = new Alumno();
//					c.setApellidos(resultSet.getString("APELLIDOS_Alumno"));
//					Alumno.add(c);
				}
			}
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}
		
		return Alumno;
	}
	
	/************************* METODO QUE COMPRUEBA SI EXISTE EL EMPLEADO *********************************/
	public boolean buscarEmpleado(Asistencia target)
	{
		boolean c=false;
		StringBuffer sql = new StringBuffer();
		sql.append("SELECT CODIGOEMPLEADO ");
		sql.append("FROM EMPLEADO WHERE CODIGOEMPLEADO = ?");
		
		try {
			preparedStatement = getConnection().prepareStatement(sql.toString());
			preparedStatement.setString(1, target.getCodigoEmpleado());
			resultSet = preparedStatement.executeQuery();
			
			c=resultSet.next();
			if(!c)
			{
				target.setMensajeError("Error: El codigo que ha introducido no existe");
				target.setMensaje("");
			}
			if(target.getCodigoEmpleado().compareTo("")==0)
			{
				target.setMensajeError("Error: Debe ingresar un codigo");
				target.setMensaje("");
			}
			//MENSAJE DE ERROR SI NO EXISTE EL DOCENTE
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}
		
		return c;

	}//FIN METODO buscarEmpleado
	/************************* METODO QUE COMPRUEBA SI EL EMPLEADO HA MARCADO ASISTENCIA**************************/
	/******* SOLO PARA EL BOTON DE ENTRADA ***************/
	public void buscarAsistencia(Asistencia target)
	{
		StringBuffer sql = new StringBuffer();
		sql.append("SELECT CODIGOEMPLEADO FROM PLANILLA ");
		sql.append("WHERE CODIGOEMPLEADO = ? AND FECHACREACION=CURDATE() AND SALIDA IS NULL");

		try {
			preparedStatement = getConnection().prepareStatement(sql.toString());
			preparedStatement.setString(1, target.getCodigoEmpleado());
			resultSet = preparedStatement.executeQuery();

			//SI NO HAY REGISTROS EL EMPLEADO NO HA MARCADO ASISTENCIA POR LO QUE SE CREARA SU ASISTENCIA		
				if(!resultSet.next()) {
						save(target);
						target.setMensaje("Su asistencia se ha ingresado correctamente");
						target.setCodigoEmpleado("");//LIMPIAR CAMPO DE TEXTO
						target.setMensajeError("");
						//JOptionPane.showMessageDialog(null, "tu asistencia fue creada");
					}
				//SI HAY REGISTROS ENTONCES YA SE HA MARCADO ASISTENCIA Y EL CAMPO SALIDA ES NULL
				else{					
					//JOptionPane.showMessageDialog(null, "Ya tenes una asistencia sin cerrar");
					target.setMensajeError("Error: Ya tiene una asistencia creada debe cerrarla antes");
					target.setMensaje("");
				}
				
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}		

	}//FIN METODO buscarAsistencia
	
	/************************* METODO QUE CERRARA LA ASISTENCIA DEL EMPLEADO SI EXISTE **************************/
	/******* SOLO PARA EL BOTON DE SALIDA ***************/
	public void cerrarAsistencia(Asistencia target)
	{
		StringBuffer sql = new StringBuffer();
		sql.append("SELECT CODIGOEMPLEADO FROM PLANILLA ");
		sql.append("WHERE CODIGOEMPLEADO = ? AND FECHACREACION=CURDATE() AND SALIDA IS NULL");

		try {
			preparedStatement = getConnection().prepareStatement(sql.toString());
			preparedStatement.setString(1, target.getCodigoEmpleado());
			resultSet = preparedStatement.executeQuery();

			//SI HAY REGISTROS EL EMPLEADO YA HA MARCADO ASISTENCIA POR LO QUE SE CERRARA LA ASISTENCIA
			//Y CALCULAR LAS HORAS TRABAJADAS EN ESE REGISTRO
				if(resultSet.next()) {
						update(target);
						target.setMensaje("Su asistencia se ha cerrado satisfactoriamente");
						target.setCodigoEmpleado("");//LIMPIAR CAMPO DE TEXTO
						target.setMensajeError("");
						//JOptionPane.showMessageDialog(null, "tu asistencia se ha cerrado");
					}
				//SI HAY REGISTROS ENTONCES YA SE HA MARCADO ASISTENCIA Y EL CAMPO SALIDA ES NULL
				else{					
					//JOptionPane.showMessageDialog(null, "No tienes ninguna asistencia abierta. Crea una primero");
					target.setMensajeError("Aun no ha marcado asistencia, cree una primero");
					target.setMensaje("");
				}
				
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			closeConnection();
		}		

	}//FIN METODO cerrarAsistencia
	

}
